package top.jiangqiang.qyblog.core.service.impl;

import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import top.jiangqiang.qyblog.common.base.response.Result;
import top.jiangqiang.qyblog.common.constant.ConfigKey;
import top.jiangqiang.qyblog.core.base.service.impl.BaseServiceImpl;
import top.jiangqiang.qyblog.core.domain.BlogConfig;
import top.jiangqiang.qyblog.core.domain.dto.BlogConfigDto;
import top.jiangqiang.qyblog.core.domain.entity.Config;
import top.jiangqiang.qyblog.core.domain.vo.BlogConfigVo;
import top.jiangqiang.qyblog.core.mapper.ConfigMapper;
import top.jiangqiang.qyblog.core.service.IConfigService;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 系统全局配置 服务实现类
 * </p>
 *
 * @author JiangQiang
 * @since 2023-01-13
 */
@Service
public class ConfigServiceImpl extends BaseServiceImpl<ConfigMapper, Config> implements IConfigService {

    @SuppressWarnings("unchecked")
    @Override
    public <T> T getConfig(String configKey) {
        Config config = lambdaQuery().eq(Config::getConfigKey, configKey).one();
        if (config == null) {
            return null;
        } else {
            return (T) config.getConfigValue();
        }
    }

    @Override
    @SuppressWarnings("unchecked")
    public <T> List<T> getConfigs(String configKeyPrefix) {
        List<Config> configs = lambdaQuery().likeRight(Config::getConfigKey, configKeyPrefix).list();
        if (CollUtil.isEmpty(configs)) {
            return new ArrayList<>();
        } else {
            return (List<T>) configs.stream().map(Config::getConfigValue).toList();
        }
    }

    @Override
    public void setConfig(String configKey, Object configValue) {
//        Config config = lambdaQuery().eq(Config::getConfigKey, configKey).one();
//        if (config != null) {
//            //更新
//            config.setConfigValue(configValue);
//            baseMapper.updateById(config);
//        } else {
//            //新增
//            config = new Config();
//            config.setConfigKey(configKey);
//            config.setConfigValue(configValue);
//            baseMapper.insert(config);
//        }
    }

    @Override
    public Result<BlogConfigVo> getBlogConfig() {
        BlogConfig blogConfig = getConfig(ConfigKey.BLOG_CONFIG);
        if (blogConfig == null) {
            return Result.ok(new BlogConfigVo());
        } else {
            return Result.ok(typeConverter.convert(blogConfig, BlogConfigVo.class));
        }
    }

    @Override
    public Result<String> updateBlogConfig(BlogConfigDto blogConfigDto) {
        BlogConfig blogConfig = typeConverter.convert(blogConfigDto, BlogConfig.class);
        setConfig(ConfigKey.BLOG_CONFIG, blogConfig);
        return Result.ok();
    }

}
